<?php
class Roles extends MY_Controller {

	// Datos para pasar a las vistas
	var $pageTitle = 'Prevet :: Usuarios :: Roles';
	var $nombre_entidad = 'Rol';		// Cadena utilizada para los títulos de las páginas

	// Vistas manejadas por el controlador
	var $CARPETA_VISTAS = 'usuarios/'; 	// Directorio donde están contenidas las vistas gestionadas por el controlador
	var $pagina_editar; 					// Nombre de la vista de edición
	var $pagina_ver;						// Nombre de la vista para mostrar todos

	public function __construct()
    {
    	parent::__construct();

    	$this->pagina_editar = $this->CARPETA_VISTAS . 'rol_edit_view';
    	$this->pagina_ver = $this->CARPETA_VISTAS . 'rol_ver_todos_view';
	}
	
	
	public function nuevo()
	{
		$dataView['title'] = 'Agregar ' . $this->nombre_entidad;
		$dataView['id_elemento'] = NULL; 	// IMPORTANTE: debe ser nulo para uno nuevo

		$this->_cargarFormEdicion($dataView);
	}

	public function editar($id_elemento)
	{
		$dataView['title'] = 'Editar ' . $this->nombre_entidad;
		$dataView['id_elemento'] = $id_elemento;

		$this->_cargarFormEdicion($dataView);
	}

	private function _cargarFormEdicion($dataView)
	{
		if(!isset($dataView['obj'.$this->nombre_entidad]))
		{
			$id_elemento = $dataView['id_elemento'];

			// Creo un objeto del modelo, para poblarlo con los datos que necesito mostrar
			$obj_rol = new Rol($id_elemento);
			$dataView['obj'.$this->nombre_entidad] = $obj_rol;
		}

		$obj_rol = $dataView['obj'.$this->nombre_entidad];
		if(($obj_rol->id != NULL && $obj_rol->editable) || $obj_rol->id == NULL) {
			parent::_loadViews($this->pagina_editar, $dataView);
		}
		else {
			$dataView['error'] = 'El rol ' . $obj_rol->nombre . ' no puede editarse.';
			$this->ver_todos($dataView);
		}
	}

	public function guardar()
	{
		$dataView['title'] = 'Guardar ' . $this->nombre_entidad;
		$dataView['error'] = '';

		// Se obtienen los datos del formulario para poblar el modelo
		$id_rol = is_numeric($this->input->post('txt_id')) ? $this->input->post('txt_id') : NULL;
		
		$obj_rol = new Rol($id_rol);
		$obj_rol->nombre = $this->input->post('txt_nombre');
		$obj_rol->es_admin = $this->input->post('chk_admin');
		$obj_rol->editable = TRUE;

		// Se manejan transacciones para interactuar con la BD
		$obj_rol->trans_begin();
		$operacion_exitosa = $obj_rol->save();
		if(!$operacion_exitosa && !$obj_rol->valid) // Falló la validación de datos
		{
			// Vuelvo a cargar el formulario de edición y mostrar los errores de validación
			$dataView['obj'.$this->nombre_entidad] = $obj_rol;
			$dataView['error'] = $obj_rol->error->string;
			$this->_cargarFormEdicion($dataView);
		}
		else
		{
			if ($obj_rol->trans_status() === FALSE) // Se chequea el estado de la transacción
			{
			    $obj_rol->trans_rollback(); // Si la transacción falló, hago un rollback
			}
			else
			{
			    $obj_rol->trans_commit(); // Transacción exitosa, realizo el commit
			}

			$dataView['error'] = $obj_rol->error->string; // Almaceno todos los errores que hubieran podido ocurrir
			$this->ver_todos($dataView);
		}
	}

	public function ver_todos($dataView = array())
	{
		$dataView['title'] = 'Listado de ' . $this->nombre_entidad . 'es';

		// Creo un objeto del modelo, para poblarlo con los datos que necesito mostrar
		$obj_rol = new Rol();
		$obj_rol->get_iterated(); // Obtengo todos los elementos

		$dataView['listado'] = $obj_rol;
		parent::_loadViews($this->pagina_ver, $dataView);
	}

	private function _eliminar($id_elemento)
	{
		$dataView['title'] = 'Eliminar ' . $this->nombre_entidad;
		$dataView['error'] = '';

		// Se obtiene el objeto que se desea eliminar
		$obj_rol = new Rol($id_elemento);
		
		// Se manejan transacciones para interactuar con la BD
		$obj_rol->trans_begin();
		$obj_rol->delete();
		if ($obj_rol->trans_status() === FALSE) // Se chequea el estado de la transacción
		{
		    $obj_rol->trans_rollback(); // Si la transacción falló, hago un rollback
		}
		else
		{
		    $obj_rol->trans_commit(); // Transacción exitosa, realizo el commit
		}

		$dataView['error'] = $obj_rol->error->string; // Almaceno todos los errores que hubieran podido ocurrir
		$this->ver_todos($dataView);
	}
}